<?php
namespace app\im\controller;
use app\im\controller\MessageHandlerV2;
use app\material\model\BrochureIm;
use Exception;
use Swoole\WebSocket\Server;
use think\App;
use think\facade\Config;
use think\session\driver\Cache;


class Ws {

    public $ws = null;

    public $server;

    public $redis;

    public $key;

    public $messageHandler;

    public function __construct() {

//        $this->key = '1223454461';
        // 加载框架里面的文件
        require __DIR__ . '/../../../vendor/autoload.php';

        $http = ( new App() )->http;

        $response = $http->run();

        $this->ws = new Server("0.0.0.0", Config::get('swoole.server.mport'));

        $this->ws->set([
            //worker进程数
            'worker_num'      => 4,
            //task进程数
            'task_worker_num' => 4,
            //listen backlog
            'backlog'         => 128,

            'max_request'     => 50,
            //心跳检测 每隔多少秒，遍历一遍所有的连接
            'heartbeat_check_interval' => 30,
            //心跳检测 最大闲置时间，超时触发close并关闭
            'heartbeat_idle_time'      => 65,
            // 总开关，用来开启tcp_keepalive
            'open_tcp_keepalive' => 1,
            // 4s没有数据传输就进行检测
            'tcp_keepidle' => 10,
            // 4s没有数据传输就进行检测
            'tcp_keepcount' => 10,
            // 1s探测一次，即每隔1s给客户端发一个包（然后客户端可能会回一个ack的包，如果服务端收到了这个ack包，那么说明这个连接是活着的）'tcp_keepcount' => 5,
            // 探测的次数，超过5次后客户端还没有回ack包，那么close此连接
            'tcp_keepinterval' => 5,

            'log_file' => '/www/wwwroot/swoole.log',

            'daemonize'       => 1
        ]);



        $this->ws->on("open", [$this, 'onOpen']);

        $this->ws->on("message", [$this, 'onMessage']);

        $this->ws->on("task", [$this, 'onTask']);

        $this->ws->on("finish", [$this, 'onFinish']);

        $this->ws->on("close", [$this, 'onClose']);

        $this->ws->on('workerStart' ,[$this ,'onWorkerStart']);

        $this->ws->start();
    }


    public function onWorkerStart()
    {

        $this->messageHandler = new Some();

    }
    /**
     * @param $ws
     * @param $request
     * @功能说明:建立连接回调
     * @author chenniang
     * @DataTime: 2021-07-02 18:17
     */
    public function onOpen($ws, $request) {

        $request->get['action'] = !empty($request->get['action'])?$request->get['action']:'mOnOpen';

        if(method_exists($this->messageHandler, $request->get['action']))
        {
//            try{
             call_user_func([$this->messageHandler, $request->get['action']] , $request->get,$request->fd);

//            }catch(Exception $e) {
//
//            }
        }

       // echo FILE_UPLOAD_PATH;


    }


    /**
     * @param $ws
     * @param $frame
     * @功能说明:接受消息回调
     * @author chenniang
     * @DataTime: 2021-07-02 18:17
     */
    public function onMessage($ws, $frame) {

        $data = @json_decode($frame->data,true);

        if(is_array($data)){

            if(method_exists($this->messageHandler, $data['action']))
            {
//                try{

                 call_user_func([$this->messageHandler, $data['action']] ,$ws,$data,$frame->fd);

//                }catch(Exception $e) {
//
//                }
            }

        }


    }



    /**
     * @param $serv
     * @param $task_id
     * @param $worker_id
     * @param $data
     * @功能说明:完成异步任务回调
     * @author chenniang
     * @DataTime: 2021-07-02 18:17
     */
    public function onTask($serv, $task_id, $worker_id, $data) {

        //返回字符串给worker进程——>触发onFinish
        return "success";
    }


    /**
     * @param $serv
     * @param $task_id
     * @param $data
     * @功能说明:完成任务投递回调
     * @author chenniang
     * @DataTime: 2021-07-02 18:16
     */
    public function onFinish($serv, $task_id, $data) {
        //task_worker进程将任务处理结果发送给worker进程
        echo "完成任务{$task_id}投递 处理结果：{$data}";
    }


    /**
     * @param $ws
     * @param $fd
     * @功能说明:关闭连接回调
     * @author chenniang
     * @DataTime: 2021-07-02 18:16
     */
    public function onClose($ws, $fd) {

//        try{

            call_user_func([$this->messageHandler, 'loginOut'] ,$ws, $fd);

//            }catch(Exception $e) {
//
//        }

//        echo "{$fd}关闭了连接1";
    }
}

$obj = new Ws();